const Uniq = require("../template")

function testUniqAdvancedMethods() {
  console.log(
    "1. 数组去重高级方法 - 自定义比较函数测试:",
    (() => {
      const array = [
        { id: 1, name: 'Alice' },
        { id: 2, name: 'Bob' },
        { id: 1, name: 'Alice' },
        { id: 3, name: 'Charlie' }
      ]
      const result = Uniq.uniqBy(array, 'id')
      return result.length === 3 // 根据id去重应该只有3个
    })()
  )

  console.log(
    "2. 数组去重高级方法 - 条件去重测试:",
    (() => {
      const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      const result = Uniq.uniqWith(array, (a, b) => a % 2 === b % 2)
      return result.length === 2 // 奇数和偶数各一个
    })()
  )

  console.log(
    "3. 数组去重高级方法 - 深度去重测试:",
    (() => {
      const array = [
        [1, 2, 3],
        [1, 2, 3],
        [4, 5, 6],
        [1, 2, 3]
      ]
      const result = Uniq.uniqDeep(array, 1)
      return result.length === 2 // 深度去重后应该只有2个
    })()
  )

  console.log(
    "4. 数组去重高级方法 - 排序去重测试:",
    (() => {
      const array = [3, 1, 2, 2, 3, 1, 4, 5, 5]
      const result = Uniq.uniqSorted(array, (a, b) => a - b)
      const expected = [1, 2, 3, 4, 5]
      return JSON.stringify(result) === JSON.stringify(expected)
    })()
  )

  console.log(
    "5. 数组去重高级方法 - 类型去重测试:",
    (() => {
      const array = [1, '1', 2, '2', 3, '3', 4, '4']
      const result = Uniq.uniqByType(array, 'number')
      return result.length === 4 // 只保留数字类型
    })()
  )

  console.log(
    "6. 数组去重高级方法 - 转换去重测试:",
    (() => {
      const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      const result = Uniq.uniqWithTransform(array, x => x % 3)
      return result.length === 3 // 余数0,1,2各一个
    })()
  )

  console.log(
    "7. 数组去重高级方法 - 验证去重测试:",
    (() => {
      const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      const result = Uniq.uniqWithValidation(array, { min: 1, max: 10 })
      return result.length === 10 // 所有元素都有效
    })()
  )

  console.log(
    "8. 数组去重高级方法 - 空数组处理测试:",
    (() => {
      const array = []
      const result = Uniq.uniq(array)
      return result.length === 0
    })()
  )

  console.log(
    "9. 数组去重高级方法 - 单元素数组测试:",
    (() => {
      const array = [1]
      const result = Uniq.uniq(array)
      return result.length === 1 && result[0] === 1
    })()
  )

  console.log(
    "10. 数组去重高级方法 - 重复元素数组测试:",
    (() => {
      const array = [1, 1, 1, 1, 1]
      const result = Uniq.uniq(array)
      return result.length === 1 && result[0] === 1
    })()
  )

  console.log(
    "11. 数组去重高级方法 - 混合类型数组测试:",
    (() => {
      const array = [1, '1', true, 'true', null, undefined, null, undefined]
      const result = Uniq.uniq(array)
      return result.length === 6 // 6种不同的值
    })()
  )

  console.log(
    "12. 数组去重高级方法 - 嵌套对象数组测试:",
    (() => {
      const array = [
        { a: { b: 1 } },
        { a: { b: 2 } },
        { a: { b: 1 } },
        { a: { b: 3 } }
      ]
      const result = Uniq.uniqBy(array, 'a.b')
      return result.length === 3 // 根据嵌套属性去重
    })()
  )

  console.log(
    "13. 数组去重高级方法 - 函数数组测试:",
    (() => {
      const fn1 = () => {}
      const fn2 = () => {}
      const array = [fn1, fn2, fn1, fn2]
      const result = Uniq.uniq(array)
      return result.length === 2 // 函数引用去重
    })()
  )

  console.log(
    "14. 数组去重高级方法 - 正则表达式数组测试:",
    (() => {
      const regex1 = /test/
      const regex2 = /test/
      const array = [regex1, regex2, regex1, regex2]
      const result = Uniq.uniq(array)
      return result.length === 2 // 正则表达式去重
    })()
  )

  console.log(
    "15. 数组去重高级方法 - 复杂对象数组测试:",
    (() => {
      const array = [
        { id: 1, data: { value: 100 } },
        { id: 2, data: { value: 200 } },
        { id: 1, data: { value: 100 } },
        { id: 3, data: { value: 300 } }
      ]
      const result = Uniq.uniqBy(array, 'id')
      return result.length === 3 // 复杂对象去重
    })()
  )
}

testUniqAdvancedMethods()
